<?php

class Model {

  protected $db;
  /* Data Table Gateway */
  public $_tabela;

  public function __construct() {
    /* Instancio o PDO */
    $this->db = new mysqli('localhost', 'root', '', 'projeto');
    $this->db->query("SET NAMES 'utf8';");
    $this->db->query('SET character_set_connection=utf8;');
    $this->db->query('SET character_set_client=utf8;');
    $this->db->query('SET character_set_results=utf8;');
  }

  /**
   * Realiza a inserção de dados no banco de dados
   * @param array $dados Dados a serem inserido. O indice do vetor representa a coluna da tabela. Ex coluna => valor
   * @access public
   * @return Boolean
   */
  public function insert(array $dados) {
    /* Cria uma string com todos os indices do vetor separados por , */
    $campos = implode(", ", array_keys($dados));
    /* Cria uma string com todos os valores do vetor separados por ', ' e concatena ' no fim e no comeco */
    $valores = "'" . implode("', '", array_values($dados)) . "'";
    /* Crio a Query */
    $sql = "INSERT INTO {$this->_tabela}({$campos}) VALUES({$valores});";
    /* Executo */
    if ($this->db->query($sql))
      return true;
    else
      return false;
  }

  /**
   * Remove determinado registro do banco de dados
   * @param String $where conteudo a ser usado como clausura where. Ex id = 1
   * @access public
   * @return void
   */
  public function delete($where) {
    $sql = "DELETE FROM {$this->_tabela} WHERE {$where};";
    $this->db->query($sql);
  }

  /**
   * Atualiza determinado registro no banco de dados
   * @param Array $dados campos a ser atualizado seguido do valor que substituira. Ex char_titulo => novo_titulo
   * @param String conteudo a ser usado como clausura where. Ex id = 1
   * @access public
   * @return void
   */
  public function update(array $dados, $where) {
    foreach ($dados as $inds => $vals) {
      $campos[] = "{$inds} = '{$vals}'";
    }
    $campos = implode(", ", $campos);
    $sql = "UPDATE {$this->_tabela} SET {$campos} WHERE {$where};";
    $this->db->query($sql);
  }

  /**
   * Função para selecionar registros do banco de dados
   * @param String $where conteudo a ser usado como clausura where. Ex id = 1. Obs deixe em branco para selecionar todos
   * @access public
   * @return Array //com o resultado do select
   */
  public function select($where = null) {
    $where = ($where != null) ? "WHERE {$where}" : "";
    $sql = "SELECT * FROM {$this->_tabela} {$where};";
    $result = $this->db->query($sql);
    if ($result == null) {
      return null;
    }
    return $result->fetch_array();
  }

  /**
   * Executa Procedure, Query semelhante ao banco de dados
   * @param String $query
   * @return array
   */
  public function query($query) {
    $resultado = $this->db->query($query);
    if (is_object($resultado) && $resultado->num_rows >= 1) {
      while ($row = $resultado->fetch_object()) {
        $user_array[] = $row;
      }
      $resultado->close();
      $this->db->next_result();
    } else {
      $user_array = null;
    }
    return $user_array;
  }

}

?>